//
//  ViewController.m
//  26-GCD
//
//  Created by dllo on 16/8/18.
//  Copyright © 2016年 ZHW. All rights reserved.
//

#import "ViewController.h"

@interface ViewController ()
@property (weak, nonatomic) IBOutlet UIImageView *photoImageView;

@end

@implementation ViewController

- (void)viewDidLoad {
    [super viewDidLoad];
    // Do any additional setup after loading the view, typically from a nib.
    // 1 GCD: Grand Central Dispatch
    // 2 GCD的核心概念: 队列 任务拆分分配到队列中, 系统会自动为我们创建线程和调度线程
    // 3 GCD中的队列严格遵循FIFO(先进先出)原则
    // 队列分类
    //   1 串行 DISPATCH_QUEUE_SERIAL / NULL
    //   2 并发 DISPATCH_QUEUE_CONCURRENT
    // 4 队列的创建
    // 参数1: 队列名字 参数2: 队列类型
    dispatch_queue_t serialQueue = dispatch_queue_create("serial", DISPATCH_QUEUE_SERIAL);
    dispatch_queue_t concurrentQueue = dispatch_queue_create("concurrentQueue", DISPATCH_QUEUE_CONCURRENT);
    // 主队列 串行
    dispatch_queue_t mainQueue = dispatch_get_main_queue();
    // 全局队列
    // 参数1: 调度队列优先级
    // 参数2: 给未来使用 现在0
    dispatch_queue_t global = dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0);
    
    // 5 同步 异步
    // 同步 串行队列 不会创建线程
    [self syncSerialQueue:serialQueue];
    // 同步 并发队列 不会创建线程
    [self syncConcurrentQueue:concurrentQueue];
    // 同步 主线程队列
    [self syncMainQueue:mainQueue];
    // 同步 全局队列 不会创建线程
    [self syncGlobalQueue:global];
    
    // 异步 串行队列
    [self asyncSerialQueue:serialQueue];
    // 异步 并发队列 根据任务决定需要创建多少线程
    [self asyncConcurrentQueue:concurrentQueue];
    // 异步 主线程队列
    [self asyncMainQueue:mainQueue];
    // 异步 全局队列
    [self asyncGlobalQueue:global];
    
    // 6 group 组
    //  1> 组的创建
    dispatch_group_t group = dispatch_group_create();
    dispatch_queue_t serialQueue1 = dispatch_queue_create("serialQueue1", DISPATCH_QUEUE_SERIAL);
    dispatch_group_async(group, serialQueue1, ^{
        NSLog(@"group -- %@", [NSThread currentThread]);
    });
    //  2> 组只有异步
    //   组中添加多个任务
    dispatch_group_async(group, serialQueue, ^{
        
        NSLog(@"group1 -- %@", [NSThread currentThread]);
    });
    
    dispatch_group_async(group, serialQueue, ^{
        
        NSLog(@"group2 -- %@", [NSThread currentThread]);
    });
    // 所有任务都执行完毕 会调用下列方法
    dispatch_group_notify(group, mainQueue, ^{
        NSLog(@"所有操作完成 执行后续操作 刷新");
    });
    
    [self getData];
    
}
// 串行: 一个任务执行完毕 再执行下一个
// 并发: 多个任务同时执行

// 同步: 在当前线程执行任务, 不能开辟线程
// 异步: 在新的线程执行任务, 可以开辟线程

- (void)getData {
   
    dispatch_queue_t concurrentQueue = dispatch_queue_create("serial", DISPATCH_QUEUE_CONCURRENT);
    dispatch_async(concurrentQueue, ^{
         NSData *data = [NSData dataWithContentsOfURL:[NSURL URLWithString:@"http://cdn.duitang.com/uploads/item/201512/24/20151224133438_ftzBJ.jpeg"]];
        dispatch_async(dispatch_get_main_queue(), ^{
            _photoImageView.image = [UIImage imageWithData:data];
        });
    });
}

// 同步 串行队列
- (void)syncSerialQueue:(dispatch_queue_t)serialQueue {
    dispatch_sync(serialQueue, ^{
        NSLog(@"同步串行执行任务");
        // block中的内容会追加到 队列中
        for (int i = 0; i < 10; i++) {
            NSLog(@"%d---%@", i, [NSThread currentThread]);
        }
    });
}

- (void)syncConcurrentQueue:(dispatch_queue_t)concurrentQueue {
    dispatch_sync(concurrentQueue, ^{
        NSLog(@"同步并发执行任务");
        for (int i = 0; i < 10; i++) {
            NSLog(@"%d---%@", i, [NSThread currentThread]);
        }
    });
}

- (void)syncMainQueue:(dispatch_queue_t)mainQueue {
    // 主线程同步主线程
#warning mark
    // 主线程等待同步操作结束 同步操作在主线程执行, 互相等待 导致程序卡死
    //    dispatch_sync(mainQueue, ^{
    //        for (int i = 0; i < 10; i++) {
    //            NSLog(@"%d---%@", i, [NSThread currentThread]);
    //        }
    //    });

}

- (void)syncGlobalQueue:(dispatch_queue_t)global {
    dispatch_sync(global, ^{
        for (int i = 0; i < 10; i++) {
            NSLog(@"同步全局执行任务%d---%@", i, [NSThread currentThread]);
        }
    });
}
#pragma mark - 异步
// 异步串行队列 创建一个新的线程 在该线程中执行
- (void)asyncSerialQueue:(dispatch_queue_t)serialQueue {
    dispatch_async(serialQueue, ^{
        // block中的内容会追到 队列中
        for (int i = 0; i < 10; i++) {
            NSLog(@"异步串行%d---%@", i, [NSThread currentThread]);
        }
    });
}

- (void)asyncConcurrentQueue:(dispatch_queue_t)concurrentQueue {
    dispatch_async(concurrentQueue, ^{
      
        for (int i = 0; i < 10; i++) {
            NSLog(@"异步并发%d---%@", i, [NSThread currentThread]);
        }
    });
}
// 异步 主线程队列
- (void)asyncMainQueue:(dispatch_queue_t)mainQueue {
    dispatch_async(mainQueue, ^{
        for (int i = 0; i < 10; i++) {
            NSLog(@"%d---%@", i, [NSThread currentThread]);
        }
    });
}

- (void)asyncGlobalQueue:(dispatch_queue_t)global {
    dispatch_async(global, ^{
        for (int i = 0; i < 10; i++) {
            NSLog(@"异步全局执行任务%d---%@", i, [NSThread currentThread]);
        }    });
}

- (void)didReceiveMemoryWarning {
    [super didReceiveMemoryWarning];
    // Dispose of any resources that can be recreated.
}


@end
